// import com.alibaba.druid.DbType;
// import com.alibaba.druid.sql.ast.*;
// import com.alibaba.druid.sql.ast.expr.*;
// import com.alibaba.druid.sql.ast.statement.*;
// import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.UpdateIndexesClause;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement.LockMode;
// import com.alibaba.druid.sql.parser.*;
// import com.alibaba.druid.util.FnvHash;

// import java.util.ArrayList;
// import java.util.List;

// import static com.alibaba.druid.sql.parser.Token.TABLE;
#pragma once
#include "../../../parser/SQLStatementParser.h"

class OracleStatementParser : virtual public SQLStatementParser
{
public:
  OracleStatementParser(string_ptr sql);
  OracleStatementParser(string_ptr sql, SQLParserFeature_list_ptr features);
  OracleStatementParser(Lexer_ptr lexer);
  // @Override
  OracleExprParser_ptr getExprParser();
  OracleCreateTableParser_ptr getSQLCreateTableParser();
  void parseInsert0_hinits(SQLInsertInto_ptr insertStatement);
  void parseStatementList(SQLStatement_list_ptr statementList, int max, SQLObject_ptr parent);
  SQLStatement_ptr parseDropType();
  // @Override
  SQLStatement_ptr parseDropMaterializedView();
  SQLStatement_ptr parseDropSynonym();
  SQLStatement_ptr parsePipeRow();
  SQLStatement_ptr parseExecute();
  SQLStatement_ptr parseRename();
  OracleExitStatement_ptr parseExit();
  SQLStatement_ptr parseReturn();
  SQLStatement_ptr parseWhile();
  SQLCreateFunctionStatement_ptr parseCreateFunction();
  SQLStatement_ptr parseFunction();
  SQLStatement_ptr parseRaise();
  SQLStatement_ptr parseCase();
  SQLStatement_ptr parseIf();
  // @Override
  OracleForStatement_ptr parseFor();
  SQLLoopStatement_ptr parseLoop();
  SQLStatement_ptr parseSet();
  SQLStatement_ptr parserAlter();
  SQLStatement_ptr parseAlterType();
  SQLStatement_ptr parseAlterFunction();
  SQLStatement_ptr parseAlterTable();
  void fillShrinkSpace(OracleAlterTableShrinkSpace_ptr item);
  void parseAlterDrop(SQLAlterTableStatement_ptr stmt);
  void parseAlterTableSplit(SQLAlterTableStatement_ptr stmt);
  OracleLockTableStatement_ptr parseLock();
  SQLStatement_ptr parseBlock();
  void parserParameters(SQLParameter_list_ptr parameters, SQLObject_ptr parent);
  OracleSelectParser_ptr createSQLSelectParser();
  SQLStatement_ptr parseInsert();
  OracleMultiInsertStatement_ptr parseMultiInsert();
  OracleExceptionStatement_ptr parseException();
  OracleReturningClause_ptr parseReturningClause();
  SQLExplainStatement_ptr parseExplain();
  SQLAnalyzeTableStatement_ptr parseAnalyzeTable();
  SQLDeleteStatement_ptr parseDeleteStatement();
  SQLStatement_ptr parseCreateDbLink();
  SQLStatement_ptr parseCreateIndex(BOOL_ptr acceptCreate);
  SQLCreateSequenceStatement_ptr parseCreateSequence(BOOL_ptr acceptCreate);
  SQLCreateProcedureStatement_ptr parseCreateProcedure();
  SQLUpdateStatement_ptr parseUpdateStatement();
  SQLStatement_ptr parseCreatePackage();
  SQLStatement_ptr parseCreateSynonym();
  SQLStatement_ptr parseCreateType();
};
